home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / sbin / mkboot < prev    next >
Text File  |  2009-02-16  |  11KB  |  418 lines

  1. #!/bin/sh
  2. # mkboot: make the system bootable
  3. # Debian GNU/Linux
  4. # Copyright 1996-1997 Guy Maor <maor@debian.org>
  5. # This is free software; see the GNU General Public License version 2
  6. # or later for copying conditions.  There is NO warranty.
  7.  
  8. set -e
  9.  
  10. PATH=$PATH:/sbin:/usr/sbin
  11.  
  12. # basic devfsd support
  13. if [ -e /dev/.devfsd ]; then
  14.     FLOPPY=/dev/floppy/0
  15. else 
  16.     FLOPPY=/dev/fd0
  17. fi
  18.  
  19. # root partition
  20. if mount | grep -q "^proc " && [ -e /proc/cmdline ]; then
  21.     rootpart=$(grep -o "root=[^ ]*" /proc/cmdline | cut -d \= -f 2)
  22. else
  23.     which rdev >/dev/null && rootpart=$(rdev | cut -d ' ' -f 1)
  24. fi
  25. # temporary directory
  26. tmpdir=${TMPDIR-/tmp}
  27.  
  28. # check whether ELILO is installed
  29. elilocheck() {
  30.     printf "\nChecking for ELILO..."
  31.     if [ -f /etc/elilo.conf ] && [ -x /usr/sbin/elilo ]; then
  32.     echo "Yes"
  33.     return 0
  34.     fi
  35.     echo "No"
  36.     return 1
  37. }
  38.  
  39. # check whether SILO is installed
  40. silocheck() {
  41.     printf "\nChecking for SILO..."
  42.     if [ -f /etc/silo.conf ] && [ -x /sbin/silo ]; then
  43.        echo "Yes"
  44.        return 0
  45.     fi
  46.     echo "No"
  47.     return 1
  48. }
  49.  
  50. # check whether GRUB is installed
  51. grubcheck () {
  52.     if ! which update-grub >/dev/null && ! which grub-install >/dev/null; then return 1; fi
  53. }
  54.  
  55. # check whether Yaboot is installed
  56. yabootcheck () {
  57.     [ -f /etc/yaboot.conf ] && [ -x /usr/sbin/ybin ] && return 0 || return 1
  58. }
  59.  
  60. # check whether Arcboot is installed
  61. arcbootcheck () {
  62.     [ -f /etc/arcboot.conf ] && [ -x /usr/sbin/arcboot ] && return 0 || return 1
  63. }
  64.  
  65. # check whether LILO is installed
  66. lilocheck () {
  67.     printf "\nChecking for LILO..."
  68.     if [ $(whoami) != root ] ; then
  69.     echo "Only root can check for LILO"
  70.         return 1;
  71.     fi
  72.     if [ ! -f /etc/lilo.conf ] || [ ! -x /sbin/lilo ] ; then
  73.     echo "No"
  74.     return 1;
  75.     fi
  76.     bootpart=$(perl -ne 'print $1 if /^\s*boot\s*=\s*(\S*)/' /etc/lilo.conf)
  77.     if [ -z "$bootpart" ] ; then
  78.     # lilo defaults to current root when 'boot=' is not present
  79.     bootpart=$rootpart
  80.     fi
  81.     if [ ${bootpart#/dev/md} != $bootpart ] ||
  82.        [ ${bootpart#/dev/evms/md} != $bootpart ]; then
  83.         echo " - on software RAID device $bootpart - assuming LILO is installed and working."
  84.         return 0;
  85.     fi
  86.     if ! dd if=$bootpart ibs=16 count=1 2>&- | grep -q LILO ; then
  87.     printf "\nYes, but I couldn't find a LILO signature on $bootpart\n"
  88.     echo "Check your /etc/lilo.conf, or run /sbin/lilo by hand."
  89.     return 1;
  90.     fi
  91.     echo "Yes, on $bootpart"
  92.     return 0;
  93. }
  94.  
  95. # check whether PALO is installed
  96. palocheck() {
  97.     printf "\nChecking for PALO..."
  98.     if [ -f /etc/palo.conf ] && [ -x /sbin/palo ]; then
  99.        echo "Yes"
  100.        return 0
  101.     fi
  102.     echo "No"
  103.     return 1
  104. }
  105.  
  106. # make a lilo boot disk
  107. makelilo () {
  108. (
  109.     b=$tmpdir/boot$$
  110.     trap "set +e; cd /; umount $FLOPPY; rmdir $b" EXIT
  111.     mkdir $b
  112.     mke2fs -q $FLOPPY 
  113.     mount -t ext2 $FLOPPY $b
  114.     if [ -e /boot/boot.b ]; then
  115.         cp /boot/boot.b $b/boot.b
  116.     fi
  117.     cp $1 $b/vmlinuz
  118.     # if a symbolic link, look for the real file
  119.     kfile=`readlink -f $1`
  120.     # see if we need an "initrd=" line in lilo.conf
  121.     kdir=`dirname $kfile`
  122.     if [ $kdir = . ]; then kdir=$PWD   # full path
  123.       elif [ $kdir = boot ]; then kdir=/boot; kfile="/$kfile"; fi
  124.     # make sure directory exists
  125.     if [ -d $kdir ]; then
  126.         # extract version
  127.         case $kfile in
  128.             *-*) kvers=${kfile#*-} ;;
  129.             *)   kvers="" ;;
  130.         esac
  131.         # look for matching initrd.img
  132.     if [ "$kvers" = "" ]; then ifile="$kdir"/initrd.img
  133.     else ifile="$kdir"/initrd.img-$kvers ; fi
  134.     #
  135.     if [ ! -f $ifile ]; then ifile=""; fi
  136.     else
  137.         kdir="" ; ifile=""
  138.     fi
  139.     # kfile is now the full path to the kernel image, and
  140.     # ifile is now the initrd.img that matches the kernel, or null
  141.     #
  142.     echo "Kernel is at $kfile in $kdir"
  143.     if [ "$ifile" != "" ]; then echo "Matching initrd image is $ifile";fi
  144.     #
  145.     lilo_conf="# floppy lilo.conf
  146.     boot = $FLOPPY
  147.     install = boot.b
  148.     map = map"
  149.     state=G
  150.     usesinitrd=n
  151.     # examine /etc/lilo.conf
  152.     while read line
  153.     do
  154.         case $line in
  155.         "#"* | "" ) continue ;;   # skip comments and blank lines
  156.         *boot*=* | *root*=* | *install*=* ) continue ;;
  157.         *map*=* | *message*=* ) continue    # skip these files as well
  158.                     ;;
  159.         *image*=* ) if [ $state = L ]; then
  160.                 break
  161.             fi   # done
  162.             #
  163.                     case $line in
  164.                 *$1 )  kimg=`echo ${line#*=}`
  165.                           state=L   # found correct kernel
  166.                           ;;
  167.                 *linu*) kimg=`echo ${line#*=}`
  168.                     # see if this is the right Linux kernel
  169.                     if [ `ls -l $kimg |
  170.                          awk '{print $NF}'` = $kfile ]; then
  171.                             state=L   # found right kernel
  172.                     else
  173.                         state=I   # Ignore wrong kernel
  174.                     fi
  175.                            ;;
  176.                 * ) state=I   # Ignore this stanza
  177.                        ;;
  178.                     esac
  179.             #
  180.             if [ $state = L ]; then
  181.                          lilo_conf="$lilo_conf
  182.                            # kernel-specific:
  183.                        $line"
  184.             fi
  185.             ;;
  186.         *other*=* ) state=I  # ignore non-Linux stanza
  187.                     ;;
  188.         * ) if [ $state != I ]; then
  189.                lilo_conf=`printf "$lilo_conf\n$line\n"`
  190.         fi
  191.         #
  192.         case $line in
  193.             *initrd*=* )  lcinitrd=`ls -l ${line#*=} |
  194.                                     awk '{print $NF}'`
  195.                           if [ $lcinitrd = "$ifile" ]; then
  196.                       usesinitrd=y
  197.                   fi
  198.                           ;;
  199.         esac
  200.         ;;
  201.     esac
  202.     done < /etc/lilo.conf
  203.     #
  204.     lilo_conf=`printf "$lilo_conf\nroot = $rootpart\n"`
  205.     #
  206.     if [ $state = L ]; then
  207.         echo "Found kernel image $kimg in existing /etc/lilo.conf"
  208.     if [ "$liloOK" != n ] && [ $usesinitrd = y ] && [ "$ifile" != "" ]; then
  209.         echo "   and the correct initrd.img as well."
  210.         problems=n
  211.     elif [ "$liloOK" != n ] && [ $usesinitrd = n ] && [ "$ifile" = "" ]; then
  212.         problems=n   # no initrd needed
  213.     elif [ "$liloOK" != n ] && [ $usesinitrd = n ] && [ "$ifile" != "" ]; then
  214.         echo "   but it does not invoke $ifile ."
  215.         problems=y
  216.     elif [ "$liloOK" = n ] && [ $usesinitrd = y ]; then
  217.         echo "   and the correct initrd.img as well,"
  218.         echo "   but there were problems in installing from it."
  219.         problems=y
  220.     else
  221.         echo "but it does not mention the required initrd.img ."
  222.         problems=y
  223.     fi
  224.     else
  225.     echo "Could not find the requested kernel in your"
  226.     echo "   current /etc/lilo.conf ."
  227.     problems=y
  228.     fi
  229.     #
  230.     if [ $problems = n ]; then
  231.         echo "Your current /etc/lilo.conf looks good, and can be used"
  232.         echo "   as the basis for the boot-floppy lilo.conf."
  233.     else
  234.         echo "The mkboot script can probably do better."
  235.     fi
  236.     sleep 8
  237.     #
  238.     echo
  239.     echo "Here is the proposed lilo.conf:"
  240.     echo
  241.     echo "$lilo_conf"
  242.     echo
  243.     echo "You can install the boot-loader from this best guess,"
  244.     echo "or you can try to install from a \`vanilla\' lilo.conf ."
  245.     echo
  246.     reply=""
  247.     while [ "$reply" = "" ]
  248.     do
  249.         printf "Which do you choose? (Enter B for best, V for vanilla): "
  250.         read reply
  251.     done
  252.     #
  253.     if [ $reply = B ] || [ $reply = b ]; then
  254.     echo "Installing the best-guess lilo.conf..."
  255.         cd $b
  256.         echo "$lilo_conf" > lilo.conf
  257.     else
  258.     echo "Installing the vanilla lilo.conf..."
  259.         cd $b
  260.         cat > lilo.conf <<- EOF
  261.         lba32
  262.         boot = $FLOPPY
  263.         install = boot.b
  264.         map = map
  265.         compact
  266.         prompt
  267.         timeout = 50
  268.         read-only
  269.         image = vmlinuz
  270.         label = linux
  271.         root = $rootpart
  272.     EOF
  273.     fi
  274.     #
  275.     lilo -C lilo.conf
  276.     cat <<EOF
  277. If you need to modify the floppy's lilo.conf, run the following:
  278.  
  279.         mount $FLOPPY /mnt
  280.         cd /mnt
  281.         vi lilo.conf        # edit the file
  282.         lilo -C lilo.conf    # run lilo on floppy
  283.         cd
  284.         umount $FLOPPY
  285. EOF
  286. )
  287. }
  288.  
  289.  
  290. # make a simple boot disk
  291. makesimple () {
  292. (
  293.     dd if=$1 of=$FLOPPY
  294.     rdev $FLOPPY $rootpart
  295.     rdev -R $FLOPPY 1
  296. )
  297. }    
  298.  
  299.  
  300.  
  301. # make a boot disk
  302. makedisk () {
  303.     kernel=${1:-/vmlinuz}
  304.     if [ ! -r $kernel ] ; then
  305.     echo "Error: Can't read $kernel."
  306.     exit 1
  307.     fi
  308.  
  309.     boottype="lilo"
  310.     if [ $(whoami) != root ] ; then
  311.     echo "Since you don't have root permissions, I can't put LILO on the diskette."
  312.     echo "I will make a non-LILO diskette instead, but it won't be as useful.  You"
  313.     echo "can hit <Ctrl-C> to cancel."
  314.     boottype="simple"
  315.     fi
  316.  
  317.     printf "\nInsert a floppy diskette into your boot drive, and press <Return>. "
  318.     read input
  319.     diskok=0
  320.     while [ "$diskok" != 1 ] ; do
  321.     printf "\nCreating a $boottype bootdisk...\n"
  322.     make$boottype $kernel
  323.     if [ $? -eq 0 ] ; then
  324.         diskok=1
  325.     else
  326.         printf "\nThere was a problem creating the boot diskette.  Please make sure that\n"
  327.         echo "you inserted the diskette into the correct drive and that the diskette"
  328.         echo "is not write-protected."
  329.         printf "\nWould you like to try again? (y/n) "
  330.         read input
  331.         if [ "$input" != "y" ] ; then
  332.         return 1
  333.         fi
  334.     fi
  335.     done
  336.     echo "...Success."
  337.     return 0
  338. }
  339.  
  340. usage="$0 [-r rootpartition] [-i] [-d device] [kernel]"
  341.  
  342. while getopts "r:id:h-" opt ; do
  343.     case "$opt" in
  344.     r) rootpart="$OPTARG" ;;
  345.     i) installkernel=1 ;;
  346.     d) FLOPPY="$OPTARG" ;;
  347.     h) echo $usage ; exit 0 ;;
  348.     -) break ;;
  349.     *) echo $usage 1>&2 ; exit 1 ;;
  350.     esac
  351. done
  352. shift $(($OPTIND - 1))
  353.  
  354. if [ "$installkernel" ] ; then
  355.     echo "In order to use the new kernel image you have just installed, you"
  356.     echo "will need to reboot the machine.  First, however, you will need to"
  357.     echo "either make a bootable floppy diskette, re-run LILO, or have GRUB"
  358.     echo "installed."
  359.  
  360.     if elilocheck; then
  361.     printf "\nShould I run /usr/sbin/elilo? (y/N) "
  362.     read input
  363.     if [ "$input" = "y" ] ; then
  364.         /usr/sbin/elilo && exit 0
  365.             echo "There was a problem running /usr/sbin/elilo."
  366.     fi
  367.     fi
  368.  
  369.     if grubcheck; then
  370.         printf "\nGRUB is installed. To automatically switch to new kernels, point your\n"
  371.         echo "default entry in menu.lst to $1"
  372.         exit 0
  373.     elif yabootcheck; then
  374.         printf "\nYaboot is installed. To automatically switch to new kernels, point your\n"
  375.         echo "default entry in /etc/yaboot.conf to $1"
  376.         exit 0
  377.     elif arcbootcheck; then
  378.         printf "\nArcboot is installed. To automatically switch to new kernels, point your\n"
  379.         echo "default entry in /etc/arcboot.conf to $1"
  380.         exit 0
  381.     fi
  382.  
  383.     if lilocheck; then
  384.         liloOK=y
  385.     printf "\nShould I run /sbin/lilo? (y/N) "
  386.     read input
  387.     if [ "$input" = "y" ] ; then
  388.         /sbin/lilo && exit 0
  389.             echo "There was a problem running /sbin/lilo."
  390.             liloOK=n
  391.     fi
  392.     fi
  393.  
  394.     if silocheck; then
  395.         printf "\nSILO is installed. To automatically switch to new kernels, point your\n"
  396.         echo "default entry in silo.conf to $1"
  397.         exit 0
  398.     fi
  399.  
  400.     if palocheck; then
  401.         printf "\nPALO is installed. To automatically switch to new kernels, point your\n"
  402.         echo "default entry in palo.conf to $1"
  403.         exit 0
  404.     fi
  405.  
  406.     printf "\nShould I make a bootdisk? (y/N) "
  407.     read input
  408.     if [ "$input" = "y" ] ; then
  409.     makedisk $1 && exit 0
  410.     fi
  411.  
  412.     printf "\nWARNING: Your system is probably unbootable now.  After correcting any\n"
  413.     echo "problems, rerun this script with the command \`mkboot -i'."
  414.     exit 1
  415. fi
  416.  
  417. makedisk $1
  418.